package com.zmcn.flowindex.fw.tool.bean;

import java.util.ArrayList;
import java.util.List;

import com.zmcn.flowindex.fw.util.FileOP;

/**
 * 解析PowerDesign数据库脚本
 * 
 * @author 欧建东
 * @email oyjd@163.com
 * 
 */
public class DbScriptMysqlParse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "D:/crebas.sql";
		List<TableVO> list = parse(path, "GBK");
		for (TableVO vo : list) {
			System.out.println(vo.getTable());
			for (ColVO v : vo.getCols()) {
				System.out.println("    " + v);
			}
			System.out.println("--------------------------------------------------------------------------------------------");
		}
	}

	/**
	 * 解析
	 * 
	 * @param path
	 * @param encoding
	 * @return
	 */
	public static List<TableVO> parse(String path, String encoding) {
		List<TableVO> list = new ArrayList<TableVO>();
		String c = FileOP.readFile(path, encoding);
		int p;
		while ((p = c.indexOf("CREATE TABLE")) != -1) {
			TableVO tableVO = new TableVO();
			int start = c.indexOf("(");
			int end = c.indexOf(");");
			String tableName = c.substring(p + "CREATE TABLE".length(), start).trim();
			tableVO.getTable().setName(tableName);
			String cols = c.substring(start + 1, end).trim();
			for (String col : cols.split(",")) {
				col = col.trim();
				if (col.startsWith("PRIMARY KEY")) {
					String pk = col.substring(col.indexOf("(") + 1, col.lastIndexOf(")"));
					for (ColVO cc : tableVO.getCols()) {
						if (cc.getName().equals(pk)) {
							cc.setPk(true);
						}
					}
				}
				else if (col.startsWith("KEY ")) {

				} 
				else {
					ColVO colVO = parseCol(col);
					tableVO.getCols().add(colVO);
				}
			}
			c = c.substring(end + 2);
			int p1 = c.indexOf("'");
			int p2 = c.indexOf("';");
			String tableDesc = c.substring(p1 + 1, p2).trim();
			tableVO.getTable().setDesc(tableDesc);
			c = c.substring(p2 + 2);
			list.add(tableVO);
		}
		return list;
	}

	/**
	 * 解析一行
	 * 
	 * @param s
	 * @return
	 */
	private static ColVO parseCol(String s) {
		ColVO vo = new ColVO();
		String[] ss = s.split(" ");
		int p = 0;
		for (String t : ss) {
			if (!"".equals(t)) {
				p++;
				if (1 == p) {
					vo.setName(t.replaceAll("\"", ""));
				} else if (2 == p) {
					if (-1 != t.indexOf("CHAR")) {
						vo.setType("String");
						String tlen = t.substring(t.indexOf("(") + 1, t.indexOf(")"));
						vo.setLen(Integer.parseInt(tlen));
					} else if (-1 != t.indexOf("DATE")) {
						vo.setType("Date");
					} else if (-1 != t.indexOf("BIGINT")) {
						vo.setType("long");
					} else if (-1 != t.indexOf("INT")) {
						vo.setType("int");
					} else if (-1 != t.indexOf("FLOAT")) {
						vo.setType("float");
					} else if (-1 != t.indexOf("NUMBER")) {
						vo.setType("long");
					} else if (-1 != t.indexOf("LONG")) {
						vo.setType("long");
					}
				}

			}
		}
		String desc = s.substring(s.indexOf("'") + 1, s.lastIndexOf("'"));
		vo.setDesc(desc);
		return vo;
	}

}
